#include <bits/stdc++.h>

using namespace std;

// 木材厂有 n 根原木，现在想把这些木头切割成 k 段长度均为 l 的小段木头（木头有可能有剩余）
// 当然，我们希望得到的小段木头越长越好，请求出 l 的最大值。
// 测试链接：https://www.luogu.com.cn/problem/P2440
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率较高的写法
// 提交以下的所有代码，可以直接通过

const int MAXN = 100001;
int arr[MAXN];
int n, k, mx;

inline int read()
{
    char ch = getchar();
    int x = 0, f = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

bool check(int m)
{
    int sum = 0;
    for(int i = 0; i < n; ++i) sum += arr[i] / m;
    return sum >= k;
}

int compute()
{
    int ans = 0, l = 1, r = mx, m;
    while(l <= r)
    {
        m = l + ((r - l) >> 1);
        if(check(m))
        {
            ans = m;
            l = m + 1;
        }
        else r = m - 1;
    }
    return ans;
}

int main()
{
    n = read(), k = read();
    for(int i = 0; i < n; ++i)
    {
        arr[i] = read();
        if(arr[i] > mx) mx = arr[i];
    }
    printf("%d\n", compute());

    return 0;
}